package com.supermap.ar.unity.utils;

import com.google.are.sceneform.math.Quaternion;
import com.google.are.sceneform.math.Vector3;

/**
 * 坐标系工具类
 * @author tanyx 2022/3/5
 * @version 1.0
 * <br/>SampleCode:<br/>
 * <code>
 *
 * </code>
 **/
public class CoordinateUtils {
    private enum Type{
        /**
         * 右手坐标系，X轴指向右方
         */
        OPENGL_X_RIGHT,
        /**
         * 右手坐标系，X轴指向前方
         */
        OPENGL_X_Forward
    }

    /**
     * 当前类型，暂时保留，便于后续拓展其他右手系
     */
    public static Type TYPE = Type.OPENGL_X_RIGHT;

    /**
     * Unity坐标与OPENGL右手系坐标的位置转换
     * @param v 位置
     * @return
     */
    public static Vector3 convert(Vector3 v){
        switch (TYPE){
            case OPENGL_X_Forward:
                return new Vector3(v.z,v.y,v.x);
            case OPENGL_X_RIGHT:
                return new Vector3(v.x,v.y,-v.z);
            default:
                return v;
        }
    }

    /**
     * Unity坐标与OPENGL右手系坐标的位置转换
     * @param x
     * @param y
     * @param z
     * @return
     */
    public static Vector3 convert(float x,float y,float z){
        switch (TYPE){
            case OPENGL_X_Forward:
                return new Vector3(z,y,x);
            case OPENGL_X_RIGHT:
                return new Vector3(x,y,-z);
            default:
                return new Vector3(x,y,z);
        }
    }

    /**
     * Unity坐标与OPENGL右手系坐标的姿态转换
     * @param q 姿态四元数
     * @return
     */
    public static Quaternion convert(Quaternion q){
        //确定轴向后，右手系与左手系的旋转方向相反,所有X,Y,Z分量取相反数
        switch (TYPE){
            case OPENGL_X_Forward:
                return new Quaternion(-q.z,-q.y,-q.x,q.w);
            case OPENGL_X_RIGHT:
                return new Quaternion(-q.x,-q.y,q.z,q.w);
            default:
                return q;
        }
    }
    /**
     * Unity坐标与OPENGL右手系坐标的姿态转换
     * @return
     */
    public static Quaternion convert(float x,float y,float z,float w){
        //确定轴向后，右手系与左手系的旋转方向相反,所有X,Y,Z分量取相反数
        switch (TYPE){
            case OPENGL_X_Forward:
                return new Quaternion(-z,-y,-x,w);
            case OPENGL_X_RIGHT:
                return new Quaternion(-x,-y,z,w);
            default:
                return new Quaternion(x,y,z,w);
        }
    }
}
